#include <stdio.h>

void bubbleSort(int arr[], int n)
{
    int i, j, temp;
    int swapped; // 用于优化，记录是否发生交换

    for (i = 0; i < n - 1; i++)
    {
        swapped = 0; // 每次遍历前重置交换标志

        printf("Pass %d:\n", i + 1); // 第几轮遍历

        // 最后i个元素已经排序完成，无需再比较
        for (j = 0; j < n - i - 1; j++)
        {
            printf("  Compare arr[%d]=%d and arr[%d]=%d: ", j, arr[j], j + 1, arr[j + 1]);

            // 如果当前元素大于下一个元素，则交换
            if (arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1; // 标记发生了交换

                printf("Swapped -> ");
            }
            else
            {
                printf("No swap -> ");
            }

            // 打印当前数组状态
            for (int k = 0; k < n; k++)
            {
                printf("%d ", arr[k]);
            }
            printf("\n");
        }

        // 如果没有发生交换，说明数组已经有序，可以提前结束
        if (!swapped)
        {
            printf("No swaps in this pass, array is sorted.\n"); // 本轮无交换，数组已排序
            break;
        }

        printf("After pass %d: ", i + 1);
        for (int k = 0; k < n; k++)
        {
            printf("%d ", arr[k]);
        }
        printf("\n\n");
    }
}

int main()
{
    int arr[] = {64, 25, 12, 22, 11};
    int n = sizeof(arr) / sizeof(arr[0]);
    int i;

    printf("Original array: "); // 原始数组
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n\n");

    bubbleSort(arr, n); // 调用冒泡排序函数

    printf("\nSorted array: "); // 排序后的数组
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}